eventcontroller: Add propagation-phase property
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 8 Apr 2014 18:25:53 +0000 (20:25 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:25 +0000 (19:54 +0200)
This is so we don't have to specify the capture phase for
every controller. The default "bubble" value will be sane
on most situations.

gtk/gtkeventcontroller.c
gtk/gtkeventcontroller.h

index cf891524eaa0e118f8261ea1efe96eab39f927d7..a4d294d2442144f8fdef2091c5ed4028cd1a0feb 100644 (file)
@@ -19,6 +19,7 @@
  */
 #include "config.h"
 #include <gtk/gtkeventcontroller.h>
+#include "gtktypebuiltins.h"
 #include "gtkmarshalers.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
@@ -27,7 +28,8 @@ typedef struct _GtkEventControllerPrivate GtkEventControllerPrivate;
 
 enum {
   PROP_WIDGET = 1,
-  PROP_EVENT_MASK
+  PROP_EVENT_MASK,
+  PROP_PROPAGATION_PHASE
 };
 
 enum {
@@ -40,6 +42,7 @@ struct _GtkEventControllerPrivate
 {
   GtkWidget *widget;
   guint evmask;
+  guint propagation_phase : 2;
 };
 
 guint signals[N_SIGNALS] = { 0 };
@@ -125,6 +128,13 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
                                                        P_("Event mask the controller handles"),
                                                        GDK_TYPE_EVENT_MASK, 0,
                                                        GTK_PARAM_READWRITE));
+  g_object_class_install_property (object_class,
+                                   PROP_PROPAGATION_PHASE,
+                                   g_param_spec_enum ("propagation-phase",
+                                                      P_("Propagation phase"),
+                                                      P_("Phase in event propagation where this controller handles events"),
+                                                      GTK_TYPE_PROPAGATION_PHASE, GTK_PHASE_BUBBLE,
+                                                      GTK_PARAM_READWRITE));
   signals[HANDLE_EVENT] =
     g_signal_new ("handle-event",
                   G_TYPE_FROM_CLASS (klass),
@@ -145,6 +155,10 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
 static void
 gtk_event_controller_init (GtkEventController *controller)
 {
+  GtkEventControllerPrivate *priv;
+
+  priv = gtk_event_controller_get_instance_private (controller);
+  priv->propagation_phase = GTK_PHASE_BUBBLE;
 }
 
 /**
@@ -263,3 +277,53 @@ gtk_event_controller_reset (GtkEventController *controller)
 
   g_signal_emit (controller, signals[RESET], 0);
 }
+
+/**
+ * gtk_event_controller_get_propagation_phase:
+ * @controller: a #GtkEventController
+ *
+ * Gets the propagation phase at which this @controller is run.
+ *
+ * Returns: The propagation phase
+ *
+ * Since: 3.14
+ **/
+GtkPropagationPhase
+gtk_event_controller_get_propagation_phase (GtkEventController *controller)
+{
+  GtkEventControllerPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER (controller), GTK_PHASE_NONE);
+
+  priv = gtk_event_controller_get_instance_private (controller);
+
+  return priv->propagation_phase;
+}
+
+/**
+ * gtk_event_controller_set_propagation_phase:
+ * @controller: a #GtkEventController
+ * @phase: the propagation phase
+ *
+ * Sets the propagation phase at which this @controller is run. Note that
+ * event controllers are run before the regular #GtkWidget::event handler.
+ *
+ * Since: 3.14
+ **/
+void
+gtk_event_controller_set_propagation_phase (GtkEventController  *controller,
+                                            GtkPropagationPhase  phase)
+{
+  GtkEventControllerPrivate *priv;
+
+  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
+  g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_CAPTURE);
+
+  priv = gtk_event_controller_get_instance_private (controller);
+
+  if (priv->propagation_phase == phase)
+    return;
+
+  priv->propagation_phase = phase;
+  g_object_notify (G_OBJECT (controller), "propagation-phase");
+}
index 12c5d2a39364dc4adbd7f22cf257bfb66b2c5050..bbefe1ba83c1befe5eb98ece7f47fa2f969b73a1 100644 (file)
@@ -29,6 +29,7 @@ typedef struct _GtkEventControllerClass GtkEventControllerClass;
 
 #include <gdk/gdk.h>
 #include <gtk/gtktypes.h>
+#include <gtk/gtkenums.h>
 
 G_BEGIN_DECLS
 
@@ -74,6 +75,14 @@ gboolean     gtk_event_controller_handle_event   (GtkEventController *controller
 GDK_AVAILABLE_IN_3_14
 void         gtk_event_controller_reset          (GtkEventController *controller);
 
+GDK_AVAILABLE_IN_3_14
+GtkPropagationPhase
+             gtk_event_controller_get_propagation_phase (GtkEventController *controller);
+
+GDK_AVAILABLE_IN_3_14
+void         gtk_event_controller_set_propagation_phase (GtkEventController  *controller,
+                                                         GtkPropagationPhase  phase);
+
 G_END_DECLS
 
 #endif /* __GTK_EVENT_CONTROLLER_H__ */